iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
AI Security

30 天認識 AI Security:從 LLM 攻擊到 AI 防禦系列 第 23

Day 23|Tool Calling Security:AI 可以呼叫 API,那誰來決定它能做什麼?

  • 分享至 

  • xImage
  •  

繼昨天的 AI Agent,今天就先介紹 Tool Calling,其實就是使用者不需要自己指定要執行哪個 Function,LLM 可以根據需求判斷要使用哪個 Tool,但現在的問題就是 LLM 說它想呼叫某個 Tool,我們就真的讓它執行嗎?話說 LLM 通常是在提出要使用哪個 Tool,真正執行 Tool 的仍然是 Application,這個要先清楚知道,LLM 還是一個純文字的推理引擎,也因此 Application 其實還有機會在 Tool 真正執行以前進行安全檢查。

假設今天有一個購物 Agent,可以使用 refundOrder(orderId, amount),模型則產生:

{
  "orderId": "A12345",
  "amount": 30000
}

最危險的做法就是拿到這些 Arguments 後直接 await refundOrder(orderId, amount),因為這些資料本質上仍然是 LLM Output,模型可能理解錯誤也可能受到 Prompt Injection 影響,所以不能因為 Tool Call 是 AI 自己產生的就把它當成可信資料,跟之前提到的一樣,LLM Output 也是 Untrusted Input,只是這次 Output 不再只是顯示給使用者看,而是準備拿去執行真正的 Function,而 Tool 的參數也要 Validation,例如退款功能可以先檢查:

function validateRefund(orderId, amount) {
  if (typeof orderId !== "string") {
    return false;
  }
  if (typeof amount !== "number" || amount <= 0) {
    return false;
  }
  return true;
}
if (!validateRefund(orderId, amount)) {
  throw new Error("Invalid tool arguments");
}
await refundOrder(orderId, amount);

這樣至少可以避免一些格式錯誤或不合理的資料直接進入 Tool,但只有格式檢查還不夠,假設攻擊者要求退款訂單A123,A123 格式完全正確,但問題是這張訂單真的是他的嗎?所以 Backend 還需要進行 Authorization:

const order = await getOrder(orderId);
if (order.userId !== currentUser.id) {
  throw new Error("Unauthorized");
}

也就是參數正確不代表這個操作有權限執行。

Tool Description 不是安全機制

開發 Agent 時我們通常會告訴 LLM Tool 是做什麼的,像是:

{
  name: "refundOrder",
  description: "Refund an order belonging to the current user"
}

這主要是幫助模型理解 refundOrder 是拿來退款目前使用者訂單的,但不能因為 Description 已經寫了 current user,就認為安全問題解決了,Description 是告訴模型怎麼使用 Tool,不是 Backend 的 Authorization,真正的限制仍然要寫在程式裡,這跟之前 System Prompt 的問題很像,Prompt 可以告訴 AI不要做,程式則應該讓 AI 做不到。

Tool 執行前還可以做什麼?

真正執行 Tool 前我們可以加入前幾天介紹過的安全控制,例如 getWeather() 這種低風險 Tool 可以直接允許,但如果是剛剛 refundOrder 這種我們就需要增加更多限制,例如確認使用者權限、限制可以操作的資料範圍、限制金額,甚至要求 Human Approval,例如:

if (toolName === "refundOrder" && amount > 10000) {
  return {
    status: "pending_approval"
  };
}

這樣就算 LLM 真的產生了一個 refundOrder("A12345", 30000) 也不代表這筆退款會立刻發生。

Tool 的回傳值也不能完全相信

還有一個很容易忽略的地方就是 Tool 不只會接收資料,也會把資料傳回 LLM,像是 const result = await searchWeb(query),搜尋結果可能來自外部網站,而外部網站的內容並不是我們可以完全控制的,如果裡面藏著惡意內容進入 LLM Context,就可能形成之前介紹過的 Indirect Prompt Injection,所以 Tool Security 還要注意 Tool 把什麼資料帶回 AI,這也是為什麼 Agent 的 Attack Surface 會比單純的 Chatbot 更大。


Tool Calling 讓 AI 從產生內容進一步擁有操作系統的能力,也因此帶來新的安全問題,所以真正重要的不是禁止 AI 使用 Tool,而是在 Tool 與真實系統之間建立安全邊界,LLM 負責判斷想做什麼,Application 負責決定它到底能不能做,而現在 Agent 使用 Tool 的方式又開始出現一套更標準化的做法,其中很重要的一個就是 MCP(Model Context Protocol),當 AI 可以透過 MCP 連接更多外部工具與資料來源時,又會出現哪些新的 Attack Surface?

下一篇:Day 24|MCP Security:當 AI 開始連接各種外部工具


上一篇
Day 22|AI Agent:當 AI 從回答問題變成自己完成任務
下一篇
Day 24|MCP Security:當 AI 開始連接各種外部工具
系列文
30 天認識 AI Security:從 LLM 攻擊到 AI 防禦24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言